spam2 = "global test spam"


def scope_test2():
    print(spam2) # 输出的是全局变量 spam = "global test spam"


def scope_test():
    def do_local():
        spam = "local spam"  # 定义局变量spam

    def do_nonlocal():
        nonlocal spam  # 使用nonlocal关键字，修改外层函数的变量spam
        spam = "nonlocal spam"

    def do_global():
        global spam  # 使用global关键字，修改/创建全局变量spam
        spam = "global spam"

    spam = "test spam"

    do_local()  # 内部重新定义了spam，不影响外层函数 scope_test() 的spam
    print("After local assignment:", spam)  # 输出的是 scope_test() 中的 spam = "test spam"

    do_nonlocal()  # 改变外层函数 scope_test() 的spam
    print("After nonlocal assignment:", spam)  # 输出的是 scope_test() 中的 spam = "nonlocal spam"

    do_global()  # 改变/创建全局变量spam
    print("After global assignment:", spam)  # 输出的是 scope_test() 中的 spam = "nonlocal spam"；不是很理解这里。。。
    """
    实际上，全局变量 spam 是在 do_global() 第一次执行时创建的，因此在 scope_test() 结束后，全局作用域中才存在 spam 变量。
    输出不是 "global spam" 的原因是，在 do_global() 中虽然修改了全局变量 spam，但在 scope_test() 函数内部打印 spam 时，它仍然引用的是函数内的局部变量 spam，其值为 "nonlocal spam"。
    """

scope_test2()

scope_test()
print("In global scope:", spam)  # 输出的是 do_global() 中创建的全局 spam = "global spam"

"""
这段代码演示了Python中变量作用域的使用：
1. `do_local()`函数内创建局部变量spam，不影响外层
2. `do_nonlocal()`使用nonlocal关键字修改外层函数的spam变量
3. `do_global()`使用global关键字修改（创建）全局变量spam
4. 通过三个函数调用展示不同作用域变量的赋值和访问规则
"""
